package com.shujia.base.day02

/**
 * 函数作为参数在实际开发中的应用。
 */
object Demo14Function {
  def main(args: Array[String]): Unit = {
    //创建一个数组
    val arr1: Array[String] = Array("hello", "world", "java", "hadoop", "hive", "flink")
    //打印数组
//    arr1.foreach(println(_))
    arr1.foreach(println)

    //需求：遍历数组，并打印每一个元素
//    for (s <- arr1) {
//      println(s)
//    }
    /*
        在上面的for循环中，<- 底层调用了IndexedSeqOptimized接口中的foreach方法
        foreach方法的本意是将序列中的元素取出，传入进来的函数中
        而foreach方法的写法如下：
          def foreach[U](f: A => U): Unit = {
            var i = 0
            val len = length
            while (i < len) { f(this(i)); i += 1 }
          }

        需要传入一个参数，没有返回值的函数
        源码中的A类似于java里的Object,任意数据类型，我们若数组调用了foreach方法的话，这里A就是数组中元素的类型
        源码中的U类似于java方法表示无返回值的意思，类似于void

     */

//    def fun1(s:String):Unit={
//      println(s)
//    }

//    arr1.foreach(fun1) // 将数组中的元素挨个取出传入fun1函数中执行
    //简化写法:
//    arr1.foreach((s:String)=>println("数加: "+s))
//    arr1.foreach(s=>println("数加: "+s))
//    arr1.foreach(println(_))
  }
}
